package com.uyong.study.util;

import java.util.Arrays;
import java.util.Random;

/**
 * @author gonggy
 * @since 2019-01-29
 */
public final class IntArrayGenerator {

	public static final int DEFAULT_SIZE = 100000;

	/**
	 * 产生一个指定大小的升序数组，范围[0,size]
	 * 
	 * @param size
	 * @return
	 */
	public static int[] ascArray(int size) {
		int[] data = new int[size];
		Arrays.setAll(data, (i) -> i);
		return data;
	}

	/**
	 * 产生一个指定大小的降序数组，范围[0,size]
	 * 
	 * @param size
	 * @return
	 */
	public static int[] descArray(int size) {
		int[] data = new int[size];
		Arrays.setAll(data, (i) -> size - i);
		return data;
	}

	/**
	 * 产生一个指定大小的伪随机正整数数组[0, 2^31-1)
	 * 
	 * @param size 数组大小
	 * @return
	 */
	public static int[] generate(int size) {
		return new Random(System.currentTimeMillis()).ints(size, 0, Integer.MAX_VALUE).toArray();
	}

	/**
	 * 产生一个指定大小，范围在[min, max)的伪随机数数组
	 * 
	 * @param size
	 * @param min
	 * @param max
	 * @return
	 */
	public static int[] generate(int size, int min, int max) {
		return new Random(System.currentTimeMillis()).ints(size, min, max).toArray();
	}

	/**
	 * 返回给定数组排序后的升序数组
	 * 
	 * @param data
	 * @return
	 */
	public static int[] sorted(int[] data) {
		int[] copy = new int[data.length];
		System.arraycopy(data, 0, copy, 0, data.length);
		Arrays.sort(copy);
		return copy;
	}

	/**
	 * 反转数组
	 * 
	 * @param data
	 */
	public static void reverse(int[] data) {
		if (data.length <= 1) {
			return;
		}
		int minddle = data.length / 2;
		if (data.length % 2 == 0) {
			for (int i = 0, j = data.length - 1; i < minddle && j >= minddle; i++, j--) {
				int tmp = data[i];
				data[i] = data[j];
				data[j] = tmp;
			}
		} else {
			for (int i = 0, j = data.length - 1; i < minddle + 1 && j > minddle; i++, j--) {
				int tmp = data[i];
				data[i] = data[j];
				data[j] = tmp;
			}
		}
	}

}
